import axios, {
  InternalAxiosRequestConfig,
  AxiosResponse,
  AxiosRequestConfig,
} from 'axios'
import { ElMessage } from 'element-plus'
import type { CustomResponse } from './type'
// 创建axios实例
const request = axios.create({
  baseURL: '/api',
  timeout: 50000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
})
// 设置请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 携带token(待做)
    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)
// 设置响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对文件类型作出特殊处理
    if (
      response.config.responseType === 'blob' ||
      response.config.responseType == 'arraybuffer'
    ) {
      return response
    }
    const { code, msg } = response.data
    // 成功
    if (code == 0) {
      return response
    }

    // 错误处理
    ElMessage.error(msg || '系统错误')
    return Promise.reject(new Error(msg || 'Error'))
  },
  (err) => {
    const { code, msg } = err.response.data
    // token过期，重新登陆
    if (code == '10001') {
      ElMessage.error('当前页已失效,请重新登录')
    } else {
      // 错误处理
      ElMessage.error(msg || '系统错误')
    }
    return Promise.reject(new Error(msg || 'Error'))
  }
)

// 接收泛型T用于接口自定义的返回结构
export default <T>(config: AxiosRequestConfig) => {
  return new Promise<CustomResponse<T>>((res, reject) => {
    request
      .request<CustomResponse<T>>(config)
      .then((response) => {
        res(response.data)
      })
      .catch((err: any) => {
        reject(err)
      })
  })
}
